"""
面向对象编程具有封装、继承和多态三大特征:
一、封装
  封装是面向对象编程的核心思想，它将对象的属性和行为封装起来（其载体是类），隐藏其实现细节，用户只需通过接口来操作对象。好比用户使用计算机时，通过键盘就可以实现一些功能，无须知道计算机内部是如何工作的
【例 6-10】  私有化变量和方法。

【参考代码】

【说明】：如果在类外部调用私有方法或访问私有变量，就会提示错误信息。例如，在程序的末尾增加两条语句“xiaolan.__sayHello()”和“print(xiaolan.__age)”，程序运行出错，结果如图6-16所示。出现上述问题的原因是“__sayHello()”为私有方法，类的外部无法调用类的私有方法。同理，如果程序执行到“print(xiaolan.__age)”时，也会提示类似的错误信息。

【小提示】：Python目前的私有机制其实是伪私有，实际上，在外部可以通过“_类名__属性”访问私有变量和调用私有方法。例如，将例6-10代码中的最后两条语句改成以下形式，也可正常运行程序。
xiaolan._People__sayHello()				#类外部调用私有方法
#类外部访问私有变量
print('我叫{}，今年{}岁了'.format(xiaolan.name,xiaolan._People__age))

"""
# 私有变量和私有方法都只能在类的内部进行访问和使用
# 私有变量就是  前面加了__符号的变量，只能通过接口函数访问
class People:  # 定义People类
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 定义私有变量__age

    def __sayHello(self):  # 定义私有方法
        print('Hello，大家好')

    def greeting(self):  # 定义接口函数，调用私有方法
        self.__sayHello()

    def getAge(self):  # 定义接口函数，返回私有变量__age的值
        return self.__age


xiaolan = People('小蓝', 10)  # 创建对象

#私有变量的访问
print(xiaolan.name)
# print(xiaolan.__age)  无法直接访问私有变量，必须通过类内部操作，返回值才能拿到
print(xiaolan.getAge())  #通过内部实例方法访问 私有变量

#私有方法的访问
# People.__sayHello()  无法直接访问私有方法，必须通过类内部操作，返回值才能拿到
# xiaolan.__sayHello() 无法直接访问私有方法，必须通过类内部操作，返回值才能拿到
xiaolan.greeting()      #通过内部实例方法访问 私有方法

# xiaolan.greeting()  # 调用接口函数
# 访问实例变量和调用接口函数并输出
# print('我叫{}，今年{}岁了。'.format(xiaolan.name, xiaolan.getAge()))
